/*
 * Copyright (c) 2018-2999 湖南洛云网络科技有限公司 All rights reserved.
 *
 * https://www.gz-yami.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

package com.yami.shop.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yami.shop.bean.app.dto.ProductDto;
import com.yami.shop.bean.app.param.SearchParam;
import com.yami.shop.bean.dto.ProdAndSkuListsDto;
import com.yami.shop.bean.dto.SearchProdDto;
import com.yami.shop.bean.model.OrderItem;
import com.yami.shop.bean.model.Product;
import com.yami.shop.bean.param.*;
import com.yami.shop.common.util.PageParam;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author yami
 */
public interface ProductMapper extends BaseMapper<Product> {


//    List<ProductDto> getcouponProdList(@Param("ids") Long[] ids, @Param("shopId") Long shopId);

    /**
     * 修改库存
     *
     * @param product 修改的库存数据
     * @return 结果
     */
    int updateStocks(@Param("prod") Product product);

//    Product getProductByProdNameAndShopId(@Param("prodName") String prodName, @Param("shopId") Long shopId);

    /**
     * 回退库存
     *
     * @param prodCollect 回退数据map
     */
    void returnStock(@Param("prodCollect") Map<Long, Integer> prodCollect);

    /**
     * 获取新品推荐商品列表
     *
     * @param page
     * @param dbLang
     * @return
     */
    IPage<ProductDto> pageByPutawayTime(IPage<ProductDto> page, @Param("dbLang") Integer dbLang);

    /**
     * 获取积分商城首页商品列表
     *
     * @param page   分页信息
     * @param dbLang 语言
     * @return 积分商城首页商品列表
     */
    IPage<ProductDto> pageByScore(IPage<ProductDto> page, @Param("dbLang") Integer dbLang);

//    IPage<ProductDto> pageByTagId(Page<ProductDto> page, @Param("tagId") Long tagId);

    /**
     * 获取销量最多的商品列表
     *
     * @param page   分页数据
     * @param dbLang 语言
     * @return 销量最多的商品列表
     */
    IPage<ProductDto> moreBuyProdList(Page<ProductDto> page, @Param("dbLang") Integer dbLang);

    /**
     * 根据条件搜索获取商品列表
     *
     * @param page        分页数据
     * @param searchParam 搜索数据
     * @return 商品列表
     */
    IPage<SearchProdDto> getSearchProdDtoPageByProdName(@Param("page") Page page, @Param("searchParam") SearchParam searchParam);

//    TagProductDto tagProdList(@Param("tagId") Long tagId);

//    List<TagProductDto> tagProdList();

    /**
     * 根据活动id获取活动商品列表
     *
     * @param page       分页数据
     * @param discountId 满减id
     * @param dbLang     语言
     * @return 活动商品列表
     */
    IPage<ProductDto> pageByDiscountId(Page<ProductDto> page, @Param("discountId") Long discountId, @Param("dbLang") Integer dbLang);

    /**
     * 查看店铺的所有活动商品
     *
     * @param page   分页数据
     * @param shopId 店铺id
     * @param dbLang 语言
     * @return 店铺的所有活动商品
     */
    IPage<ProductDto> listByShopId(@Param("page") PageParam<ProductDto> page, @Param("shopId") Long shopId, @Param("dbLang") Integer dbLang);

    /**
     * 通过优惠券适用商品类型、优惠券id、店铺id获取商品列表
     *
     * @param page             分页数据
     * @param shopId           店铺id
     * @param dbLang           语言
     * @param suitableProdType 适用商品类型
     * @param couponId         优惠券id
     * @return 商品列表
     */
    IPage<ProductDto> listBySuitableProdTypeAndCouponIdAndShopId(@Param("page") PageParam<ProductDto> page, @Param("shopId") Long shopId, @Param("suitableProdType") Integer suitableProdType,
                                                                 @Param("couponId") Long couponId, @Param("dbLang") Integer dbLang);

    /**
     * 获取用户的收藏商品列表
     *
     * @param page   分页数据
     * @param userId 用户id
     * @param dbLang 语言
     * @return 用户的收藏商品列表
     */
    IPage<ProductDto> collectionProds(@Param("page") PageParam page, @Param("userId") String userId, @Param("dbLang") Integer dbLang);

    /**
     * 通过商品ids列表获取商品列表及商品所有属性
     *
     * @param prodIds 商品ids
     * @return 商品列表
     */
    List<ProdAndSkuListsDto> getProdAndSkuLists(@Param("prodIds") List<Long> prodIds);

    /**
     * 更新商品为活动商品
     *
     * @param groupActivityId 拼团活动id
     * @param prodIds         商品ids
     */
    void updateProductToGroup(@Param("groupActivityId") Long groupActivityId, @Param("prodIds") List<Long> prodIds);

    /**
     * 更新商品为非活动商品
     *
     * @param prodId 商品id
     */
    void updateProductToUnGroup(@Param("prodId") Long prodId);

    /**
     * 通过活动id更新活动商品为非拼团商品
     *
     * @param groupActivityId 拼团活动id
     */
    void updateToUnGroupByGroupActivityId(@Param("groupActivityId") Long groupActivityId);

    /**
     * 通过活动id获取商品列表
     *
     * @param groupActivityIds 拼团活动ids
     * @return 商品列表
     */
    List<Product> listByActivityId(@Param("groupActivityIds") List<Long> groupActivityIds);

    /**
     * 更新注水销量
     *
     * @param waterSoldNum 注水销量
     * @param prodId       产品id
     */
    void updateWaterSoldNum(@Param("waterSoldNum") Integer waterSoldNum, @Param("prodId") Long prodId);

    /**
     * 更新商品为待审核状态
     *
     * @param prodId 商品id
     * @return 更新结果
     */
    int updateToApply(@Param("prodId") Long prodId);

    /**
     * 更新商品为商家下架状态
     *
     * @param prodId 商品id
     * @return 更新结果
     */
    int updateToShopOffline(@Param("prodId") Long prodId);

    /**
     * 更新商品为下架状态
     *
     * @param prodId 商品id
     * @return 更新结果
     */
    int updateToOffline(@Param("prodId") Long prodId);

    /**
     * 通过订单项更新商品的销量
     *
     * @param orderItems 订单项
     */
    void updateSoldNum(@Param("orderItems") List<OrderItem> orderItems);

    /**
     * 下架店铺所有的商品
     *
     * @param shopId 店铺id
     * @return 结果
     */
    int offlineProdByShopId(@Param("shopId") Long shopId);

    /**
     * 获取商品列表及对应店铺名称
     *
     * @param page    分页信息
     * @param product 筛选信息
     * @return 商品列表
     */
    IPage<Product> getPageAndShopName(PageParam<Product> page, @Param("product") ProductParam product);

    /**
     * 获取商品列表通过订单编号
     *
     * @param orderNumber 订单编号
     * @return 商品列表
     */
    List<ProdOrderParam> getProdsByOrderNumber(@Param("orderNumber") String orderNumber);

    /**
     * 修改商品信息
     *
     * @param product 商品信息
     */
    void updateProduct(@Param("product") Product product);

    /**
     * 获取用于导出的商品列表
     *
     * @param productParam 商品筛选信息
     * @return 商品列表
     */
    List<ProductExportParam> listProdsByProdParam(@Param("productParam") ProductExportParam productParam);

    /**
     * 通过分类ids改变商品为下架状态
     *
     * @param categoryIds 分类ids
     * @param shopId      店铺id
     */
    void offlineProdByCategoryId(@Param("categoryIds") List<Long> categoryIds, @Param("shopId") Long shopId);

    /**
     * 分页获取上架的商品信息
     *
     * @param page    分页信息
     * @param product 商品筛选信息
     * @return
     */
    IPage<Product> pageProducts(PageParam<Product> page, @Param("product") ProductParam product);

    /**
     * 在架商品数据
     *
     * @param param 筛选参数
     * @return 在架商品数据
     */
    int countProdOnSale(@Param("param") ProdAnalysisSurveyParam param);

    /**
     * 统计时间内销量不为零的商品数量
     *
     * @param param 筛选参数
     * @return 商品数量
     */
    int countProdDynamicSale(@Param("param") ProdAnalysisSurveyParam param);

    /**
     * 在架商品数据,根据参数分页获取商品数据
     *
     * @param page  分页数据
     * @param param 筛选参数
     * @return 商品数据
     */
    IPage<ProdEffectRespParam> getProdByParam(PageParam<Product> page, @Param("param") ProdEffectParam param, @Param("prodIds") Set<Long> prodIds);

    /**
     * 支付商品件数
     *
     * @param prodId 商品id
     * @param param  参数
     * @return 支付商品件数
     */
    Integer countPayNum(@Param("prodId") Long prodId, @Param("param") ProdEffectParam param);

    /**
     * 筛选获取商品分页列表
     *
     * @param page    分页数据
     * @param product 商品筛选信息
     * @return 商品分页列表
     */
    IPage<Product> pageByLang(PageParam<Product> page, @Param("product") ProductParam product);

    /**
     * 通过商品id和语言获取商品信息
     *
     * @param prodId 商品id
     * @param dbLang 语言
     * @return 商品信息
     */
    Product selectByIdAndLang(@Param("prodId") Long prodId, @Param("dbLang") Integer dbLang);

    /**
     * 通过商品id修改库存
     *
     * @param product 商品信息
     * @return 修改结果
     */
    int updateStocksById(@Param("prod") Product product);

    /**
     * 恢复普通商品
     *
     * @param products 商品信息
     */
    void updatePreSale(@Param("products") List<Product> products);

//    IPage<ProductTagParam> pageByLangAndTag(PageParam<Product> page, @Param("productTagParam") ProductTagParam productTagParam, @Param("isContain") Integer isContain);

    /**
     * 分页获取商品信息
     *
     * @param product 商品筛选信息
     * @return 分页获取商品信息
     */
    List<Product> listProdByIdsAndType(@Param("product") ProductParam product);

    /**
     * 通过商品ids获取商品列表
     *
     * @param prodIds 商品ids
     * @return 商品列表
     */
    List<Product> getProductListBySpuIds(@Param("prodIds") Set<Long> prodIds);

    /**
     * 还原退款数量库存
     *
     * @param prodId 商品id
     * @param count  退款数量
     */
    void addInventory(@Param("prodId") Long prodId, @Param("count") Integer count);

    IPage<SearchProdDto> getSearchProdDtoPageByProdNameOrcategories(@Param("page") Page page, @Param("searchParam") SearchParam searchParam, @Param("categories") List<Long> categories);
}
